package com.css.fxfzmhwz.common.utils;

import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.List;

/**
 * @Description 校验对象中参数是否为空
 * @Author zyc
 * @Date 2021/2/5 16:51
 * @Version V1.0
 */
@Slf4j
public class CheckObjFields {
    /**
     * 判断该对象的属性是否全部为空
     *
     * @param obj          对象
     * @param excludeNames 选择忽略校验的属性名称List集合
     * @return boolean
     * @throws Exception
     */
    public static boolean isAllFieldNull(Object obj) {
        // 取到obj的class, 并取到所有属性
        Field[] fs = obj.getClass().getDeclaredFields();
        // 定义一个flag, 标记是否所有属性值为空
        boolean flag = true;
        // 遍历所有属性
        try {
            for (Field f : fs) {
                // 设置私有属性也是可以访问的
                f.setAccessible(true);
                // 1.属性值不为空, 2.属性值转换成String不为""
                if (f.get(obj) != null && !"".equals(f.get(obj).toString())) {
                    // 有属性满足3个条件的话, 那么说明对象属性不全为空
                    flag = false;
                    break;
                }
            }
        } catch (Exception e) {
            log.error("CheckObjAllFields.isAllFieldNull检验对象属性是否存在null--------" + obj.getClass());
            return flag;
        }
        return flag;
    }

    /**
     * 判断该对象的一部分属性是否全部为空
     *
     * @param obj          对象
     * @param excludeNames 选择忽略校验的属性名称List集合
     * @return boolean
     * @throws Exception
     */
    public static boolean isAllFieldNull(Object obj, List<String> excludeNames) {
        // 取到obj的class, 并取到所有属性
        Field[] fs = obj.getClass().getDeclaredFields();
        // 定义一个flag, 标记是否所有属性值为空
        boolean flag = true;
        if (null == excludeNames) {
            excludeNames = Lists.newArrayList();
        }
        // 遍历所有属性
        try {
            for (Field f : fs) {
                // 设置私有属性也是可以访问的
                f.setAccessible(true);
                // 1.排除不包括的属性名, 2.属性值不为空, 3.属性值转换成String不为""
                if (!excludeNames.contains(f.getName()) && f.get(obj) != null && !"".equals(f.get(obj).toString())) {
                    // 有属性满足3个条件的话, 那么说明对象属性不全为空
                    flag = false;
                    break;
                }
            }
        } catch (Exception e) {
            log.error("CheckObjAllFields.isAllFieldNull检验对象属性是否存在null--------" + obj.getClass());
            return flag;
        }
        return flag;
    }

    /**
     * 属性转换，在大写前加‘_’并把大写转换成小写
     *
     * @param property          属性
     * @return String
     * @throws Exception
     */
    public static String propertyChange(String property) {
        StringBuilder sb=new StringBuilder();
        char[] chars = property.toCharArray();
        for (char c : chars) {
            if (Character.isUpperCase(c)){
                sb.append(("_"+c).toLowerCase());
                continue;
            }
            sb.append(c);
        }
        return sb.toString();
    }
}
